package org.whm.appcore;

import java.util.Properties;

import javax.sql.DataSource;

import org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.stereotype.Component;
import org.springframework.transaction.interceptor.TransactionInterceptor;

/**
 * 
 * @author Administrator 事务管理器
 */
@Component
public class TxConfig {

	// 创建事务管理器
	@Bean(name = "txManager")
	public DataSourceTransactionManager getTx(@Autowired DataSource ds) {
		DataSourceTransactionManager dsTx = new DataSourceTransactionManager(ds);
		return dsTx;
	}

	// 创建事务通知。。

	@Bean(name = "txAdvice")
	public TransactionInterceptor getAdvisor(@Qualifier("txManager") DataSourceTransactionManager txManager)
			throws Exception {
		TransactionInterceptor tsi = new TransactionInterceptor();
		Properties properties = new Properties();
		properties.setProperty("get*", "PROPAGATION_REQUIRED,-Exception,readOnly");
		properties.setProperty("find*", "PROPAGATION_REQUIRED,ISOLATION_DEFAULT,-Exception");
		properties.setProperty("add*", "PROPAGATION_REQUIRED,-Exception");
		properties.setProperty("save*", "PROPAGATION_REQUIRED,-Exception");
		properties.setProperty("update*", "PROPAGATION_REQUIRED,ISOLATION_DEFAULT,-Exception");
		tsi.setTransactionManager(txManager);
		tsi.setTransactionAttributes(properties);
		return tsi;

	}

	@Bean
	public BeanNameAutoProxyCreator txProxy() {
		BeanNameAutoProxyCreator creator = new BeanNameAutoProxyCreator();
		creator.setInterceptorNames("txAdvice");
		creator.setBeanNames("*Service", "*ServiceImpl");
		creator.setProxyTargetClass(true);
		return creator;
	}
}
